home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’93 / Inside Mac Movie Toolbox Code / mtb11.c < prev    next >
Text File  |  1992-10-22  |  5KB  |  166 lines

  1. //    Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  2.  
  3. #include "mtb.h"
  4.  
  5. /* for the following constants, please consult the Macintosh    
  6.     Audio Compression and Expansion Toolkit, specifically pages
  7.     38 and 39 */
  8. #define kMACEBeginningNumberOfBytes  6
  9. #define kMACE31MonoPacketSize  2
  10. #define kMACE31StereoPacketSize  4
  11. #define kMACE61MonoPacketSize  1
  12. #define kMACE61StereoPacketSize  2
  13.  
  14. void CreateSoundDescription (Handle sndHandle,
  15.                                 SoundDescriptionHandle    sndDesc,
  16.                                 long *sndDataOffset,
  17.                                 long *numSamples,
  18.                                 long *sndDataSize )
  19. {
  20.     long                            sndHdrOffset = 0;
  21.     long                            sampleDataOffset;
  22.     SoundHeaderPtr                             sndHdrPtr = nil;
  23.     long                            numFrames;
  24.     long                            samplesPerFrame;
  25.     long                            bytesPerFrame;
  26.     SignedByte                            sndHState;
  27.     SoundDescriptionPtr                            sndDescPtr;
  28.     
  29.     *sndDataOffset = 0;
  30.     *numSamples = 0;
  31.     *sndDataSize = 0;
  32.  
  33.     SetHandleSize( (Handle)sndDesc, sizeof(SoundDescription) );
  34.     CheckError(MemError(),"\pSetHandleSize"); 
  35.     
  36.     sndHdrOffset = GetSndHdrOffset (sndHandle);
  37.     if (sndHdrOffset == 0) CheckError(-1,  "\pGetSndHdrOffset ");
  38.  
  39.     // we can use pointers since we don't move memory
  40.     sndHdrPtr = (SoundHeaderPtr) (*sndHandle + sndHdrOffset);
  41.     sndDescPtr = *sndDesc;
  42.     
  43.     sndDescPtr->descSize = sizeof (SoundDescription);    
  44.                 // total size of sound description structure
  45.     sndDescPtr->resvd1 = 0;                            
  46.     sndDescPtr->resvd2 = 0;
  47.     sndDescPtr->dataRefIndex = 1;
  48.     sndDescPtr->compressionID = 0;
  49.     sndDescPtr->packetSize = 0;
  50.     sndDescPtr->version = 0;                                
  51.     sndDescPtr->revlevel = 0;
  52.     sndDescPtr->vendor = 0;  
  53.     
  54.     switch  (sndHdrPtr->encode) {
  55.         case stdSH:
  56.             sndDescPtr->dataFormat = 'raw ';
  57.                                         // uncompressed offset-binary data
  58.             sndDescPtr->numChannels = 1;                            
  59.                                         // number of channels of sound
  60.             sndDescPtr->sampleSize = 8;
  61.                                         // number of bits per sample
  62.             sndDescPtr->sampleRate = sndHdrPtr->sampleRate;    
  63.                                         // sample rate        
  64.             *numSamples                     = sndHdrPtr->length;                
  65.             *sndDataSize                     = *numSamples;
  66.             bytesPerFrame                     = 1;      
  67.             samplesPerFrame = 1;
  68.             sampleDataOffset = (Ptr)&sndHdrPtr->sampleArea
  69.                                                             - (Ptr)sndHdrPtr;
  70.             break;            
  71.  
  72.         case extSH:
  73.             {
  74.             ExtSoundHeaderPtr                             extSndHdrP;
  75.  
  76.             extSndHdrP = (ExtSoundHeaderPtr)sndHdrPtr;
  77.             
  78.             sndDescPtr->dataFormat = 'raw ';    
  79.                                         // uncompressed offset-binary data
  80.             sndDescPtr->numChannels = extSndHdrP->numChannels;    
  81.                                         // number of channels of sound
  82.             sndDescPtr->sampleSize = extSndHdrP->sampleSize;
  83.                                         // number of bits per sample
  84.             sndDescPtr->sampleRate = extSndHdrP->sampleRate; 
  85.                                         // sample rate            
  86.             numFrames = extSndHdrP->numFrames;                
  87.             *numSamples = numFrames;
  88.             bytesPerFrame = extSndHdrP->numChannels * 
  89.                                             ( extSndHdrP->sampleSize / 8);
  90.             samplesPerFrame = 1;
  91.             *sndDataSize = numFrames * bytesPerFrame;
  92.             sampleDataOffset = (Ptr)(&extSndHdrP->sampleArea)
  93.                                                              - (Ptr)extSndHdrP;
  94.             }
  95.             break;
  96.             
  97.         case cmpSH:
  98.             {
  99.             CmpSoundHeaderPtr     cmpSndHdrP;
  100.  
  101.             cmpSndHdrP = (CmpSoundHeaderPtr)sndHdrPtr;
  102.             sndDescPtr->numChannels = cmpSndHdrP->numChannels;
  103.                     // number of channels of sound
  104.             sndDescPtr->sampleSize = cmpSndHdrP->sampleSize;
  105.                     // number of bits per sample before compression
  106.             sndDescPtr->sampleRate = cmpSndHdrP->sampleRate;
  107.                     // sample rate
  108.             numFrames = cmpSndHdrP->numFrames;     
  109.             sampleDataOffset =(Ptr)(&cmpSndHdrP->sampleArea) 
  110.                                                             - (Ptr)cmpSndHdrP;
  111.             switch (cmpSndHdrP->compressionID) {
  112.                 case threeToOne:
  113.                     sndDescPtr->dataFormat = 'MAC3';
  114.                     // compressed 3:1 data
  115.                     samplesPerFrame = kMACEBeginningNumberOfBytes;   
  116.                     *numSamples = numFrames * samplesPerFrame;
  117.                     switch (cmpSndHdrP->numChannels) {
  118.                         case 1:    
  119.                             bytesPerFrame = cmpSndHdrP->numChannels 
  120.                                                 * kMACE31MonoPacketSize;
  121.                             break;
  122.                         case 2:    
  123.                             bytesPerFrame = cmpSndHdrP->numChannels 
  124.                                                 * kMACE31StereoPacketSize;
  125.                             break;
  126.                         default: 
  127.                             CheckError(-1, "\pCorrupt sound data" );
  128.                             break;
  129.                         }
  130.                     *sndDataSize     = numFrames * bytesPerFrame;
  131.                     break;
  132.                 case sixToOne:
  133.                     sndDescPtr->dataFormat = 'MAC6';  
  134.                     // compressed 6:1 data
  135.                     samplesPerFrame = kMACEBeginningNumberOfBytes;  
  136.                     *numSamples = numFrames * samplesPerFrame;
  137.                     switch (cmpSndHdrP->numChannels) {
  138.                         case 1:
  139.                             bytesPerFrame = cmpSndHdrP->numChannels 
  140.                                                 * kMACE61MonoPacketSize;      
  141.                             break;
  142.                         case 2:    
  143.                             bytesPerFrame = cmpSndHdrP->numChannels 
  144.                                                     * kMACE61StereoPacketSize;  
  145.                             break;
  146.                         default:
  147.                             CheckError(-1, "\pCorrupt sound data" );
  148.                             break;
  149.                     }
  150.                     *sndDataSize = (*numSamples) * bytesPerFrame;
  151.                     break;
  152.                 default:
  153.                     CheckError(-1, "\pCorrupt sound data" );
  154.                     break;
  155.             }
  156.             } // switch cmpSndHdrP->compressionID:*/
  157.             break; // of cmpSH:
  158.             
  159.         default:
  160.             CheckError(-1, "\pCorrupt sound data" );
  161.             break;
  162.             
  163.     } // switch sndHdrPtr->encode*/
  164.     *sndDataOffset = sndHdrOffset + sampleDataOffset;  
  165. }
  166.